package com.gitee.wsl.security.signature.sm2

//import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
//import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
//import org.bouncycastle.crypto.params.ECPublicKeyParameters;
//import org.bouncycastle.math.ec.ECPoint;

//class Cipher {
//    private var ct = 1
//    private var p2: ECPoint? = null
//    private var sm3keybase: SM3Digest? = null
//    private var sm3c3: SM3Digest? = null
//    private val key: ByteArray = ByteArray(32)
//    private var keyOff: Byte = 0
//
//    private fun Reset() {
//        this.sm3keybase = SM3Digest()
//        this.sm3c3 = SM3Digest()
//
//        var p: ByteArray? = Util.byteConvert32Bytes(p2.getX().toBigInteger())
//        this.sm3keybase!!.update(p!!, 0, p.size)
//        this.sm3c3!!.update(p, 0, p.size)
//
//        p = Util.byteConvert32Bytes(p2.getY().toBigInteger())
//        this.sm3keybase!!.update(p!!, 0, p.size)
//        this.ct = 1
//        NextKey()
//    }
//
//    private fun NextKey() {
//        val sm3keycur = SM3Digest(this.sm3keybase!!)
//        sm3keycur.update((ct shr 24 and 0xff).toByte())
//        sm3keycur.update((ct shr 16 and 0xff).toByte())
//        sm3keycur.update((ct shr 8 and 0xff).toByte())
//        sm3keycur.update((ct and 0xff).toByte())
//        sm3keycur.doFinal(key, 0)
//        this.keyOff = 0
//        this.ct++
//    }
//
//    fun Init_enc(sm2: SM2, userKey: ECPoint): ECPoint? {
//        val key: AsymmetricCipherKeyPair = sm2.ecc_key_pair_generator.generateKeyPair()
//        val ecpriv: ECPrivateKeyParameters =
//            key.getPrivate() as ECPrivateKeyParameters
//        val ecpub: ECPublicKeyParameters =
//            key.getPublic() as ECPublicKeyParameters
//        val k: BigInteger? = ecpriv.getD()
//        val c1: ECPoint? = ecpub.getQ()
//        this.p2 = userKey.multiply(k)
//        Reset()
//        return c1
//    }
//
//    fun Encrypt(data: ByteArray) {
//        this.sm3c3!!.update(data, 0, data.size)
//        for (i in data.indices) {
//            if (keyOff.toInt() == key.size) {
//                NextKey()
//            }
//            data[i] = data[i].toInt() xor key[(keyOff++).toInt()].toInt()
//        }
//    }
//
//    fun Init_dec(userD: BigInteger?, c1: ECPoint) {
//        this.p2 = c1.multiply(userD)
//        Reset()
//    }
//
//    fun Decrypt(data: ByteArray?) {
//        for (i in data!!.indices) {
//            if (keyOff.toInt() == key.size) {
//                NextKey()
//            }
//            data[i] = data[i].toInt() xor key[(keyOff++).toInt()].toInt()
//        }
//
//        this.sm3c3!!.update(data, 0, data.size)
//    }
//
//    fun Dofinal(c3: ByteArray?) {
//        val p: ByteArray? = Util.byteConvert32Bytes(p2.getY().toBigInteger())
//        this.sm3c3!!.update(p!!, 0, p.size)
//        this.sm3c3!!.doFinal(c3!!, 0)
//        Reset()
//    }
//}


//import com.gitee.wsl.security.hash.SM3Digest
//import com.gitee.wsl.security.signature.cipher.Cipher
//import com.ionspin.kotlin.bignum.integer.BigInteger
//import org.bouncycastle.asn1.DERInteger
//import org.bouncycastle.asn1.DERObject
//
//object SM2Utils {
//    @Throws(IOException::class)
//    fun encrypt(publicKey: ByteArray?, data: ByteArray?): ByteArray? {
//        if (publicKey == null || publicKey.size == 0) {
//            return null
//        }
//
//        if (data == null || data.size == 0) {
//            return null
//        }
//
//        val source = ByteArray(data.size)
//        java.lang.System.arraycopy(data, 0, source, 0, data.size)
//
//        val cipher: Cipher = Cipher
//        val sm2: SM2 = SM2.Instance()
//        val userKey: org.bouncycastle.math.ec.ECPoint? = sm2.ecc_curve.decodePoint(publicKey)
//
//        val c1: org.bouncycastle.math.ec.ECPoint = cipher.Init_enc(sm2, userKey)
//        cipher.Encrypt(source)
//        val c3 = ByteArray(32)
//        cipher.Dofinal(c3)
//
//        val x: DERInteger = DERInteger(c1.getX().toBigInteger())
//        val y: DERInteger = DERInteger(c1.getY().toBigInteger())
//        val derDig: org.bouncycastle.asn1.DEROctetString = org.bouncycastle.asn1.DEROctetString(c3)
//        val derEnc: org.bouncycastle.asn1.DEROctetString = org.bouncycastle.asn1.DEROctetString(source)
//        val v: org.bouncycastle.asn1.ASN1EncodableVector = org.bouncycastle.asn1.ASN1EncodableVector()
//        v.add(x)
//        v.add(y)
//        v.add(derDig)
//        v.add(derEnc)
//        val seq: org.bouncycastle.asn1.DERSequence = org.bouncycastle.asn1.DERSequence(v)
//        val bos: ByteArrayOutputStream = ByteArrayOutputStream()
//        val dos: org.bouncycastle.asn1.DEROutputStream = org.bouncycastle.asn1.DEROutputStream(bos)
//        dos.writeObject(seq)
//        return bos.toByteArray()
//    }
//
//    @Throws(IOException::class)
//    fun decrypt(privateKey: ByteArray?, encryptedData: ByteArray?): ByteArray? {
//        if (privateKey == null || privateKey.size == 0) {
//            return null
//        }
//
//        if (encryptedData == null || encryptedData.size == 0) {
//            return null
//        }
//
//        var enc: ByteArray? = ByteArray(encryptedData.size)
//        java.lang.System.arraycopy(encryptedData, 0, enc, 0, encryptedData.size)
//
//        val sm2: SM2 = SM2.Instance()
//        val userD = BigInteger(1, privateKey)
//
//        val bis: ByteArrayInputStream = ByteArrayInputStream(enc)
//        val dis: org.bouncycastle.asn1.ASN1InputStream = org.bouncycastle.asn1.ASN1InputStream(bis)
//        val derObj: DERObject = dis.readObject()
//        val asn1: org.bouncycastle.asn1.ASN1Sequence = derObj as org.bouncycastle.asn1.ASN1Sequence
//        val x: DERInteger = asn1.getObjectAt(0) as DERInteger
//        val y: DERInteger = asn1.getObjectAt(1) as DERInteger
//        val c1: org.bouncycastle.math.ec.ECPoint? = sm2.ecc_curve.createPoint(x.getValue(), y.getValue(), true)
//
//        val cipher: Cipher = Cipher
//        cipher.Init_dec(userD, c1)
//        val data: org.bouncycastle.asn1.DEROctetString = asn1.getObjectAt(3) as org.bouncycastle.asn1.DEROctetString
//        enc = data.getOctets()
//        cipher.Decrypt(enc)
//        val c3 = ByteArray(32)
//        cipher.Dofinal(c3)
//        return enc
//    }
//
//    @Throws(IOException::class)
//    fun sign(userId: ByteArray?, privateKey: ByteArray?, sourceData: ByteArray?): ByteArray? {
//        if (privateKey == null || privateKey.size == 0) {
//            return null
//        }
//
//        if (sourceData == null || sourceData.size == 0) {
//            return null
//        }
//
//        val sm2: SM2 = SM2.Instance()
//        val userD = BigInteger(privateKey)
//        println("userD: " + userD.toString(16))
//        println("")
//
//        val userKey: org.bouncycastle.math.ec.ECPoint = sm2.ecc_point_g.multiply(userD)
//        println("椭圆曲线点X: " + userKey.getX().toBigInteger().toString(16))
//        println("椭圆曲线点Y: " + userKey.getY().toBigInteger().toString(16))
//        println("")
//
//        val sm3 = SM3Digest()
//        val z: ByteArray = sm2.sm2GetZ(userId, userKey)
//        println("SM3摘要Z: " + Util.getHexString(z))
//        println("")
//
//        println("M: " + Util.getHexString(sourceData))
//        println("")
//
//        sm3.update(z, 0, z.size)
//        sm3.update(sourceData, 0, sourceData.size)
//        val md = ByteArray(32)
//        sm3.doFinal(md, 0)
//
//        println("SM3摘要值: " + Util.getHexString(md))
//        println("")
//
//        val sm2Result: SM2Result = SM2Result()
//        sm2.sm2Sign(md, userD, userKey, sm2Result)
//        println("r: " + sm2Result.r.toString(16))
//        println("s: " + sm2Result.s.toString(16))
//        println("")
//
//        val d_r: DERInteger = DERInteger(sm2Result.r)
//        val d_s: DERInteger = DERInteger(sm2Result.s)
//        val v2: org.bouncycastle.asn1.ASN1EncodableVector = org.bouncycastle.asn1.ASN1EncodableVector()
//        v2.add(d_r)
//        v2.add(d_s)
//        val sign: DERObject = org.bouncycastle.asn1.DERSequence(v2)
//        val signdata: ByteArray? = sign.getDEREncoded()
//        return signdata
//    }
//
//    @Throws(IOException::class)
//    fun verifySign(userId: ByteArray?, publicKey: ByteArray?, sourceData: ByteArray?, signData: ByteArray?): Boolean {
//        if (publicKey == null || publicKey.size == 0) {
//            return false
//        }
//
//        if (sourceData == null || sourceData.size == 0) {
//            return false
//        }
//
//        val sm2: SM2 = SM2.Instance()
//        val userKey: org.bouncycastle.math.ec.ECPoint? = sm2.ecc_curve.decodePoint(publicKey)
//
//        val sm3 = SM3Digest()
//        val z: ByteArray = sm2.sm2GetZ(userId, userKey)
//        sm3.update(z, 0, z.size)
//        sm3.update(sourceData, 0, sourceData.size)
//        val md = ByteArray(32)
//        sm3.doFinal(md, 0)
//        println("SM3摘要值: " + Util.getHexString(md))
//        println("")
//
//        val bis: ByteArrayInputStream = ByteArrayInputStream(signData)
//        val dis: org.bouncycastle.asn1.ASN1InputStream = org.bouncycastle.asn1.ASN1InputStream(bis)
//        val derObj: DERObject = dis.readObject()
//        val e: Enumeration<DERInteger?> = (derObj as org.bouncycastle.asn1.ASN1Sequence).getObjects()
//        val r: BigInteger? = (e.nextElement() as DERInteger).getValue()
//        val s: BigInteger? = (e.nextElement() as DERInteger).getValue()
//        val sm2Result: SM2Result = SM2Result()
//        sm2Result.r = r
//        sm2Result.s = s
//        println("r: " + sm2Result.r.toString(16))
//        println("s: " + sm2Result.s.toString(16))
//        println("")
//
//
//        sm2.sm2Verify(md, userKey, sm2Result.r, sm2Result.s, sm2Result)
//        return sm2Result.r.equals(sm2Result.R)
//    }
//}
